<?php

declare(strict_types=1);
/**
 * This file is part of Hyperf.
 *
 * @link     https://www.hyperf.io
 * @document https://doc.hyperf.io
 * @contact  group@hyperf.io
 * @license  https://github.com/hyperf-cloud/hyperf/blob/master/LICENSE
 */

namespace App\Library\Log;


use Hyperf\Logger\LoggerFactory;
use Hyperf\Utils\ApplicationContext;

/**
 * 日志记录
 */
class Log
{

    protected static function getLogLevel(string $level){
        switch ($level){
            case 'debug':   return 'debug';
            case 'notice':  return 'notice';
            case 'info':    return 'info';
            case 'warning': return 'warning';
            case 'error':   return 'error';
            case 'fatal':   return 'emergency';
            default:        return 'info';
        }
    }

    protected static function getSystemLogLevel(string $level){
        switch ($level){
            case 'debug':   return 'debug';
            case 'notice':  return 'notice';
            case 'info':    return 'info';
            case 'warning': return 'warning';
            case 'error':   return 'error';
            case 'fatal':   return 'error';
            default:        return 'info';
        }
    }

    /**
     * 写入日志
     * @param string $level
     * @param string $message
     * @param string $file
     * @param int $line
     * @return array
     */
    protected static function write(string $level, string $message, string $file, int $line)
    {

        $array = [
            'File' => $file,
            'Line' => $line,
        ];

        //系统原生
        ApplicationContext::getContainer()->get(LoggerFactory::class)->get('log', 'default')->log(static::getSystemLogLevel($level), $message, $array);

    }

    /**
     * debug日志
     * @param string $message 日志内容
     * @param string $moduleName 模块名
     * @param string $className 二级分类名
     * @return array
     */
    public static function debug(\Exception $exception, string $message='')
    {
        return static::write('debug', $exception->getMessage() . ' - ' . $message, $exception->getFile(), $exception->getLine());
    }

    /**
     * notice日志
     * @param string $message 日志内容
     * @param string $moduleName 模块名
     * @param string $className 二级分类名
     * @return array
     */
    public static function notice(\Exception $exception, string $message='')
    {
        return static::write('notice', $exception->getMessage() . ' - ' . $message, $exception->getFile(), $exception->getLine());
    }

    /**
     * info日志
     * @param string $message 日志内容
     * @param string $moduleName 模块名
     * @param string $className 二级分类名
     * @return array
     */
    public static function info(\Exception $exception, string $message='')
    {
        return static::write('info', $exception->getMessage() . ' - ' . $message, $exception->getFile(), $exception->getLine());
    }

    /**
     * warning日志
     * @param string $message 日志内容
     * @param string $moduleName 模块名
     * @param string $className 二级分类名
     * @return array
     */
    public static function warning(\Exception $exception, string $message='')
    {
        return static::write('warning', $exception->getMessage() . ' - ' . $message, $exception->getFile(), $exception->getLine());
    }

    /**
     * error日志
     * @param string $message 日志内容
     * @param string $moduleName
     * @return array
     */
    public static function error(\Exception $exception, string $message='')
    {
        return static::write('error', $exception->getMessage() . ' - ' . $message, $exception->getFile(), $exception->getLine());
    }

    /**
     * fatal日志
     * @param string $message 日志内容
     * @param string $moduleName 模块名
     * @return array
     */
    public static function fatal(\Exception $exception, string $message='')
    {
        return static::write('fatal', $exception->getMessage() . ' - ' . $message, $exception->getFile(), $exception->getLine());
    }

}